awk memo

Last update 2018.7.6

基本(?) 

ファイル(仮に abe.dat とする)の2列目を表示させたいとき
awk '{print $2}' abe.dat

3行目を表示させたいとき
awk 'NR==3{print}' abe.dat

3列目が 正 の場合のみ表示させる
awk '$3>0 {print}' file.dat

3列目が 0 かつ 5列目が 0.5 以上の場合のみ表示させる
awk '$3 == 0 && $5 > 0.5 {print}' file.dat

フォーマットを変えたいとき。
oldval=1234

# 1234.000000 
newval=`echo $oldval | awk '{ OFMT = "%.6f"} {print $1*1.00000000001 }'`

# 1.23400e+03
newval=`echo $oldval | awk '{ OFMT = "%.6e"} {print $1*1.00000000001 }'`

もっと精度が欲しい場合は、1.000....01 の0を増やす。 もしくは、oldval が整数でなければ、$1+0. でも良い。 +0. や *1.00000000001 が無いと、数値として認識してくれないので、こうする。

script 内で使うとき 

Script内の変数をawkの引数などで使いたいときは、awkの変数に変更する必要があるようだ。
hoge = 3;
awk -v hoge=$hoge 'NR==hoge{print}' abe.dat

#  次のは動かない
awk 'NR==$hoge{print}' abe.dat

gnuplot で使うとき 

plot "< awk '$7<0{print}' file.dat" u 1:7

行と列を入れ替えたい 

paste -s をつかうが、awkも使うので、ここに書く。次のデータがあったとして、
 a 10
 b 20
 c 30
次のように行と列を入れ替えたいとする。
 a  b  c
 10 20 30
これは、例えばcalchepでpar_scan_sum したいときにしたくなる場合がある。 このデータが書かれたファイルを"data.dat"として、次のようにする。
awk '{print $1}' data.dat > dam1.dat
awk '{print $2}' data.dat > dam2.dat
paste -s dam1.dat dam2.dat > newdata.dat
paste の -s が重要。-sが無いと、data.dat と同じになってしまう。